package com.demo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.dto.MedicineDTO;
import com.demo.entity.Category;
import com.demo.entity.Medicine;
import com.demo.mapper.MedicineMapper;
import com.demo.service.CategoryService;
import com.demo.service.MedicineService;
import com.demo.util.MyPage;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * (Medicine)表服务实现类
 *
 * @author Sakura
 * @since 2023-11-26 17:11:07
 */
@Service("medicineService")
public class MedicineServiceImpl extends ServiceImpl<MedicineMapper,Medicine> implements MedicineService {
    @Resource
    private MedicineMapper medicineMapper;

    @Autowired
    private CategoryService categoryService;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Medicine queryById(Long id) {
        return this.medicineMapper.queryById(id);
    }

        /**
     * 分页查询
     *
     * @param pageNo    当前页
     * @param pageSize  数据大小
     * @param searchKey 查询关键字
     * @return 查询结果
     */
    @Override
    public MyPage<MedicineDTO> queryByPage(Integer pageNo, Integer pageSize, String searchKey) {
                // 创建一个LambdaQueryWrapper对象
        LambdaQueryWrapper<Medicine> wrapper = new LambdaQueryWrapper<>();

        // 根据searchKey查询Medicine对象，通过getName方法获取名称，与searchKey比较后筛选数据
        wrapper.eq(searchKey != null && searchKey != "", Medicine::getName, searchKey);

        // 根据id降序排序
        wrapper.orderByDesc(Medicine::getId);

        // 根据pageNo和pageSize创建一个Page对象，并使用wrapper作为查询条件获取数据分页对象
        Page<Medicine> page = this.page(new Page<>(pageNo, pageSize), wrapper);

        // 将page中的记录转换为MedicineDTO对象，并计算库存总和
        List<MedicineDTO> medicineDTOList = page.getRecords().stream().map(item -> {
            MedicineDTO dto = new MedicineDTO();
            BeanUtils.copyProperties(item, dto);
            dto.setSum(item.getStock());

            // 获取categoryService根据CategoryId获取的Category对象
            Category category = categoryService.getById(item.getCategoryId());

            // 如果category对象不为空，则设置dto的category属性为category的名称
            if (category != null) {
                dto.setCategory(category.getName());
            }

            return dto;
        }).collect(Collectors.toList());

        // 返回一个包含medicineDTOList和page.getTotal()值的MyPage对象
        return new MyPage<MedicineDTO>(medicineDTOList, page.getTotal());

    }


    /**
     * 新增数据
     *
     * @param medicine 实例对象
     * @return 实例对象
     */
    @Override
    public boolean insert(Medicine medicine) {
        int result = this.medicineMapper.insert(medicine);
        return result > 0;
    }

    /**
     * 修改数据
     *
     * @param medicine 实例对象
     * @return 实例对象
     */
    @Override
    public boolean updateById(Medicine medicine) {
        int result = this.medicineMapper.updateById(medicine);
        return result > 0;
     }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.medicineMapper.deleteById(id) > 0;
    }

}
